跳到主要内容

触发器,trigger

场景:

日志系统,记录对学生表有哪些操作!

解决的问题:

1, 得到每条学生记录被修改的时机,才能发出记录日志的动作!

2, 执行某段操作,需要得到当前处理的记录的信息!

触发器:一种编程设计!类似js的基于事件编程的程序设计的理念!可以在某个表的每条记录上,设置一个事件,从而对该表上的某些操作,加以监听!一旦所监听的行为出现,则会执行相应的代码。

记录 =button

(修改,删除,增加) =click

执行操作 =alert(‘Hello’);

以上的所有行为,都是采用sql完成的:

语法
--

create trigger 触发器名字触发条件,监听的内容,触发后执行的操作

CREATE TRIGGER *trigger\_nametrigger\_timetrigger\_event* ON *tbl\_name* FOR EACH ROW *trigger\_stmt*

其中,触发条件,事件。是由事件的时机,与事件的内容组成

时机:之前before,和之后after!

内容:增加insert,删除delete,修改update

因此,一共只有六种事件:

before insert before delete before update

after insert after delete after update

监听的主体是由表中的记录发出的

ontable\_name for each row

执行的操作,就是一段sql的集合!

建立日志表:

执行插入:

日志表内的记录自动增加:

可见 insert into student\_log的触发程序,执行成功!

删除触发器

drop trigger 触发器名字

在触发程序中得到当前触发的记录信息
-----------------

有,两个!

new(新的),old(旧的)

new,和old,都表示触发程序的记录!

new:新的记录。old:旧的记录!

取决于当前操作(intser,update,delete)去使用其中某个:

insert,增加记录,没有旧记录,只有new关键字可以使用

delete,删除记录,没有新纪录,只有old可用!

update,更新,既有新纪录,也有旧记录,更新前是旧记录,而更新后是新纪录!因此可以 new和 old

记录,当前学生被删除之后,记录日志,要求记录学生的id。

测试,删除记录:

此时,留意一下触发器,与具体的语法的执行时机:

当:insert into table操作!

判断,是否有before insert 触发器!有则执行触发程序!

真正执行 insert into

判断,是否有after insert 触发器!有则执行触发程序!

更新日志:

记录更新日志,要求是,只对某部分同学完成更新日志!

只记录,身高超过175学生的更新记录!记录学生id和修改前的身高与之后的身高

需要额外的增加条件判断!

逻辑分支语句:

if 条件 then

语句体

else if 条件 then

语句体

….

else

语句体

end if;

sql语句的结束符问题

可以修改最外层的语句结束符达到目的!

delimiter $$

将语句结束修改成 $$

记住用完后要再修改回来!

如果触发程序由多条语句组成块。此时就需要使用

begin

end 将语句块包裹!

测试:

注意,关于触发器:

1, 一个表上的一个事件只能有一个触发器,如果需要,只能将原始的去掉,新增!

2, 只要事件发生,触发程序就可能执行!一条语句可能触发多个触发程序!

例如:

insert into on duplicate key update

before insert trigger, insert 操作失败before update trigger, update操作, after update

before insert trigger, insert 操作成功after insert trigger

php项目中用的不多

![](2E56EEB0FE0617FF6BB84F7FA7083DC6.png)

上一篇: 25 SQL编程介绍